package com.example.seleniumautotest.googleDrive;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.List;
import java.util.Set;


public class FirstDrive {
    WebDriver webDriver = null;

    void createDriver(){
        //1.打开浏览器
        //启动驱动化程序管理
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = new ChromeOptions();
        /*
        * 浏览器参数
        * */
        //无头模式（背地里偷偷执行，报错告诉我）
        options.addArguments("-headless");
        //加载策略
        options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
        options.addArguments("--remote-allow-origins=*");

        //打开谷歌驱动器
        webDriver = new ChromeDriver(options);
    }


    //测试百度搜索
    void test01() throws InterruptedException {
        //1.打开浏览器
        createDriver();
        //2.输入网址
        webDriver.get("https://www.baidu.com");

        //3.输入内容
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("hhh");
//        Thread.sleep(1000);

        //4.点击搜索
        webDriver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        //5.关闭浏览器
        webDriver.quit();
    }

    void test02() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[3]/a/span[2]")).click();
        Thread.sleep(5000);
        webDriver.quit();
    }

    /*
    * 获取文字信息
    * */
    void test03(){
        createDriver();
        webDriver.get("https://www.baidu.com");
        //获取不是标签内的信息
        String txt = webDriver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(3) > a > span.title-content-title")).getText();
        System.out.println("获取到的信息是："+txt);

        //获取标签内的信息
        txt = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        System.out.println("百度一下按钮中的文字信息是："+txt);
        webDriver.quit();

    }

    /*
    * 窗口大小设置
    * */
    void test04() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.manage().window().maximize();
        Thread.sleep(2000);
        webDriver.manage().window().minimize();
        Thread.sleep(2000);
        webDriver.manage().window().fullscreen();
        Thread.sleep(2000);
        webDriver.quit();
    }

    /*
    * 两个页面之间的跳转，检测问题
    * */
    void text05(){
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();

        //切换driver操作
        String curDriver = webDriver.getWindowHandle();
        Set<String> drivers = webDriver.getWindowHandles();
        for (String driver : drivers){
            if(driver != curDriver){
                webDriver.switchTo().window(driver);
            }
        }

        //如果没有切换操作，直接点击会出现报错，由于页面还处于第一个driver，点开一个新的，处于第二个driver，对象不同不能正确控制
        webDriver.findElement(By.cssSelector("#pane-news > div > ul > li.hdline0 > strong > a")).click();
        webDriver.quit();
    }


    /*
    * 屏幕截图
    * */
    void test06() throws IOException {
        createDriver();
        webDriver.get("https://www.baidu.com");

        //进行截图，并生成file
        File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //对生成的file进行保存
        //同名文件会被覆盖
//        FileUtils.copyFile(file,new File("./data/baidu.png"));

        //优化
        SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat time = new SimpleDateFormat("HH-mm-ss");

        String dirTime = ymd.format(System.currentTimeMillis());
        String fileTime = time.format(System.currentTimeMillis());

        //这里只截屏一个，没事，但是如果截图多次，会出现覆盖问题，需要精度到毫秒
        String filePath = "./src/test/image/"+dirTime+"/baidu-"+fileTime+".png";


        FileUtils.copyFile(file,new File(filePath));
        webDriver.quit();
    }

    /*
    * 关闭窗口
    * */
    void test07() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();

        //切换driver操作
        String curDriver = webDriver.getWindowHandle();
        Set<String> drivers = webDriver.getWindowHandles();
        for (String driver : drivers){
            if(driver != curDriver){
                webDriver.switchTo().window(driver);
            }
        }
        Thread.sleep(3000);
        
        //关闭窗口
        webDriver.close();
        Thread.sleep(5000);
        //关闭驱动
        webDriver.quit();
    }

    /*
    * 等待
    * */
    void test08() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("hhh");
        webDriver.findElement(By.cssSelector("#su")).click();

        //（强制等待）.这里强制等待3秒
//        Thread.sleep(3000);

        //隐式等待
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        //这里会报错——NoSuchElementException，并不是找不到元素，而是速度太快了，没有反应过来
        webDriver.findElement(By.cssSelector("#\\31  > div > h3 > a > div > div > p > span > span")).click();
        webDriver.quit();
    }

    /*
    * 隐式等待——只是查看元素在不在，而不是对不对（这里返回的结果都是那英）
    * 生命周期是全局
    * */
    void test09() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("那英");
        webDriver.findElement(By.cssSelector("#su")).click();
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        String ele = webDriver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.false > div > div.cos-row.row-text_3Un8U.row_1inPx > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span")).getText();
        System.out.println("txt:"+ele);

        webDriver.findElement(By.cssSelector("#kw")).clear();
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("张杰");
        webDriver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        ele = webDriver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.false > div > div.cos-row.row-text_3Un8U.row_1inPx > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span")).getText();
        System.out.println("txt:"+ele);
        webDriver.quit();
    }

    /*
    * 显示等待——查看+验证
    * */
    void test10() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        //设置WebDriverWait对象，并设置等待时间
        WebDriverWait webDriverWait = new WebDriverWait(webDriver,Duration.ofSeconds(3));
        //检验这个是否可以点击
        webDriverWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#kw")));
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("那英");
        webDriver.findElement(By.cssSelector("#su")).click();

        //也可以判断内容是否符合预期
        //如果没有找到，就会报错超时
        webDriverWait.until(ExpectedConditions.textToBe(By.cssSelector("#\\31  > div > div > div > div > div > div.false > div > div.cos-row.row-text_3Un8U.row_1inPx > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"),"那英"));
        webDriver.quit();
    }

    /*
    * 浏览器导航（前进，后退，刷新）
    * */
    void test11() throws InterruptedException {
        createDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("那英");
        webDriver.findElement(By.cssSelector("#su")).click();

        Thread.sleep(3000);
        webDriver.navigate().back();
        Thread.sleep(3000);
        webDriver.navigate().refresh();
        Thread.sleep(3000);
        webDriver.navigate().forward();
        webDriver.quit();
    }

    /*
    * 显示等待和隐式等待尽量不要一起使用，时间会不固定
    * */
    void test12(){
        createDriver();
        webDriver.get("https://www.baidu.com");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH-mm-ss");

        String time = simpleDateFormat.format(System.currentTimeMillis());
        System.out.println("之前的时间为："+time);
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        WebDriverWait webDriverWait = new WebDriverWait(webDriver,Duration.ofSeconds(10));
        try{
            //方法里面包含查询操作，就会调用隐式等待
            webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#\\31  > did ")));
        }catch (Exception e){
            System.out.println("未找到");
        }
        String curTime = simpleDateFormat.format(System.currentTimeMillis());
        System.out.println("之前的时间为："+curTime);
        webDriver.quit();
    }


    /*
    * 弹窗
    * */
    void test13(){
        Alert alert = webDriver.switchTo().alert();
        alert.sendKeys("hhh");
        alert.accept();
        alert.dismiss();
    }

    /*
    * 文件上传（实际上就是发送文件的位置）
    * */
}
